Ext.define('NMC.controller.UsersController', {
    extend: 'Ext.app.Controller',

    stores: ['UsersStore'],

    models: ['UserModel'],

    views: ['user.UserEdit','user.UserList'],

    refs: [
        {
            ref: 'usersPanel',
            selector: 'panel'
        }
    ],
    

    init: function() {
	
        this.control({
            'viewport > panelPrincipal > panelAdministration > panelAdmUser': {
                afterrender : this.firstRender
            },
            'viewport > panelPrincipal > panelAdministration > panelAdmUser > userList dataview': {
                itemclick : this.selectUser
            },
            'viewport > panelPrincipal > panelAdministration > panelAdmUser  button[action=save]': {
                click: this.saveChanges
            }
            ,
            'viewport > panelPrincipal > panelAdministration > panelAdmUser  button[action=cancel]': {
                click: this.cancelChanges
            },
            'viewport > panelPrincipal > panelAdministration > panelAdmUser  button[action=add]': {
                click: this.addRecord
            }
            ,
            'viewport > panelPrincipal > panelAdministration > panelAdmUser  button[action=delete]': {
                click: this.confirmDelete
            }
        });
    },

    // Sélection d'un utilisateur dans le gridPanel
    selectUser : function(grid,newRecord){
        var panelForm = Ext.getCmp('userEdit'),
            form = panelForm.getForm(),
            lastRecord = form.getRecord();
            
        var store = Ext.getStore('UsersStore');

        if (form.isDirty()){
            // Si changement, on demande confirmation
            Ext.Msg.show({
                 title:'Enregistrer les changements',
                 msg: 'L\'enregistrement en cours a été modifié. Voulez vous enregistrer ces changements ?',
                 buttons: Ext.Msg.YESNO,
                 scope: this,
                 fn:function(button){
                     if (button == 'yes'){
                         this.saveChanges(button,newRecord);
                     }
                     else{
                         this.cancelChanges(button,newRecord);
                     }
                 },
                 animateTarget: 'userEdit',
                 icon: Ext.window.MessageBox.QUESTION
            });
        }
        else{
            if (lastRecord.get('id').indexOf('ext') >= 0){
                store.remove(lastRecord);
            }
            //On change l'enregistrement actif
            this.goNewRecord(newRecord);
            
        }
        
        
        
    },
    
    //Enregistrement des modifications
    saveChanges : function(button,newRecord){
        var panelForm = Ext.getCmp('userEdit'),
            form = panelForm.getForm(),
            record = form.getRecord();
            
        var store = Ext.getStore('UsersStore');
            
        if (form.isDirty()){
            //On soumet le formulaire au serveur
            form.submit({
                waitMsg:'Sauvegarde en cours...',
                url:'./users/submit',
                scope:this,
                success: function(form,action) {
                    // On récupère l'id issu de la base.
                    var results = Ext.decode(action.response.responseText);
                    var insertedRecord = results.records

                    record.set('id',insertedRecord.id);


                    // Ensuite, on recharge le store pour recharger la liste
                    store.load({
                        scope   : this,
                        callback: function(records, operation, success) {
                            if (this.isRecord(newRecord)){
                                this.goNewRecord(newRecord);
                            }else{
                                this.goNewRecord(record);
                            }
                        }
                    });                    
                },
                failure: function(form,action){
                    Ext.MessageBox.alert('Sauvegarde interdite, veuillez vérifier le formulaire !');
                    //On reste sur l'enregistrement en cours pour permettre la modification
                }
            });
            
        }
    },
    //Annuler les changements du formulaire
    cancelChanges:function(button,newRecord){
        var panelForm = Ext.getCmp('userEdit'),
            form = panelForm.getForm(),
            record = form.getRecord();
            
        var grid = Ext.getCmp('userList');
        var store = Ext.getStore('UsersStore');
        
        
        
        //On ré-initialise le formulaire
        form.reset();
        
        //Si on était en création, on supprime le record du store et on se postionne sur le premier record
        if (record.get('id').indexOf('ext') >= 0){
            store.remove(record);
            newRecord = store.first();
        }
        
        
        // Si le deuxième champs est le record de destination, on recharge tout
        if (this.isRecord(newRecord)){
            this.goNewRecord(newRecord);
        }
        
    },
    //Se déplacer vers le nouvel enregistrement
    goNewRecord:function(lastRecord){
        if (this.isRecord(lastRecord)){
            var panelForm = Ext.getCmp('userEdit'),
                form = panelForm.getForm(),
                grid = Ext.getCmp('userList');

            var userId = lastRecord.get('id');
            var newRecord = Ext.getStore('UsersStore').findRecord('id',userId);

            //On re-sélectionne l'enregistrement en question
            grid.getView().select(newRecord);
            grid.getView().focus();

            //On charge le formulaire avec l'enregistrement sélectionné     
            form.trackResetOnLoad = true;
            form.loadRecord(newRecord);
        }
        
    },
    addRecord : function(button){
        var panelForm = Ext.getCmp('userEdit'),
            form = panelForm.getForm(),
            record = form.getRecord();
            
        if (record.get('id').indexOf('ext') < 0){
            //Si on n'est pas déjà en ajout, on ajoute
            var newRecord = new NMC.model.UserModel({
                id : Ext.id()
            });

            Ext.getStore('UsersStore').add(newRecord);	

            this.goNewRecord(newRecord);
        }

    },
    confirmDelete : function(button){
      
      Ext.Msg.show({
         title:'Suppression d\'enregistrement',
         msg: 'Etes vous sur de vouloir supprimer cet enregistrement ?',
         buttons: Ext.Msg.YESNO,
         scope: this,
         fn:function(button){
             if (button == 'yes'){
                 this.deleteRecord(button);
             }
         },
         animateTarget: 'userEdit',
         icon: Ext.MessageBox.WARNING
    });  
        
        
        
    },
    deleteRecord : function(button){
       var panelForm = Ext.getCmp('userEdit'),
            form = panelForm.getForm(),
            record = form.getRecord();
			
        var store = Ext.getStore('UsersStore');
        
        //Si on était en création, on supprime le record du store
        if (record.get('id').indexOf('ext') >= 0){
            store.remove(record);
            this.goNewRecord(store.first());
        }else{
            Ext.Ajax.request({
                url: './users/delete',
                params: {
                        id: record.get('id')
                },
                waitMsg:'Suppression en cours...',
                scope : this,
                success: function(response, opts) {
                     // On supprime le record du Store pour ne pas rappeler le serveur
                    store.remove(record);
                    // Et on se positionne sur le premier enreg
                    this.goNewRecord(store.first());
                },
                failure: function(response, opts) {
                    Ext.MessageBox.alert('La suppression n\'a pas pu être effectuée, vérifiez les dépendances  !');
                }
            });
        }
        
    },
    firstRender : function(component,object){
        this.goNewRecord(Ext.getStore('UsersStore').first());
    },
	
    //Vérifie que le paramètre testé est de type Record
    isRecord : function(object){
        return object && (object instanceof Ext.data.Model);
    }
    
	
});
